import Vue from 'vue'
import Vuex from 'vuex'
import createPersistedState from 'vuex-persistedstate'
Vue.use(Vuex)
/*eslint spaced-comment:0*/
const formatState = {
  // 登录相关信息
  loginTime: null,
  authorization: null,
  // 平台信息
  platform: {
    name: null
  },
  // 登录用户机构信息
  institution: {
    id: null,
    name: null,
    // 是否开启会诊服务
    canConsultation: 0,
    // 是否终审
    canFinalVerify: 0,
    finalExertId: null
  },
  // 登录用户信息
  user: {
    id: null,
    name: null,
    headImgUrl: null,
    phone: null
  },
  // 当前用户权限列表
  permissionList: null,
  // 用户上次操作时间
  lastTime: null,
  // 当前路由值，用于确定左侧菜单选中值
  nowRoute: null,
  config: null,
  // 操作参数，统一控制当前用户的可编辑项的页面参数
  uArgs: {
    // 当前管理是否为平台管理
    isPlatformManage: 0,
    // 是否为新增操作
    isAddNew: 0,
    // 页面机构 id
    institutionId: 0,
    // 用户管理页面 id
    userId: 0,
    // 查看/ 编辑会诊的id
    consultationId: 0
  },
  indexManageInfo: {},
  padStatus: false,
}

const store = new Vuex.Store({
  // 在刷新后从 sessionStorage 读取 state 数据
  // state: sessionStorage.getItem('state')
  //   ? JSON.parse(sessionStorage.getItem('state'))
  //   : formatState,

  state: {
    // 登录相关信息
    loginTime: null,
    authorization: null,
    device: 'desktop',
    // 平台信息
    platform: {
      name: null
    },
    // 登录用户机构信息
    institution: {
      id: null,
      name: null,
      // 是否开启会诊服务
      canConsultation: 0,
      // 是否终审
      canFinalVerify: 0,
      finalExertId: null
    },
    // 登录用户信息
    user: {
      id: null,
      name: null,
      headImgUrl: null,
      phone: null,
      roleName: null
    },
    // 当前用户权限列表
    permissionList: null,
    // 用户上次操作时间
    lastTime: null,
    // 当前路由值，用于确定左侧菜单选中值
    nowRoute: null,
    config: null,
    // 操作参数，统一控制当前用户的可编辑项的页面参数
    uArgs: {
      // 当前管理是否为平台管理
      isPlatformManage: 0,
      // 是否为新增操作
      isAddNew: 0,
      // 页面机构 id
      institutionId: 0,
      // 用户管理页面 id
      userId: 0,
      // 查看/ 编辑会诊的id
      consultationId: 0
    },
    indexManageInfo: {},
    filterFormForPreviousAndNext: {},
    padStatus: false
  },
  mutations: {
    TOGGLE_DEVICE: (state, device) => {
      state.device = device
    },
    /*eslint no-unused-vars:0*/
    /* eslint no-param-reassign: ["error", { "props": false }] */
    // 初始化state
    stateInit(state) {
      /*eslint no-param-reassign:0*/
      state = formatState
    },
    // 设置用户登录时间
    loginTimeFlash(state) {
      state.loginTime = new Date().getTime()
    },
    // 刷新用户上次操作时间
    lastTimeFlash(state) {
      state.lastTime = new Date().getTime()
    },
    // 通用设置字段方法，慎用
    setPropertyGeneral(state, setter) {
      state[setter.key] = setter.value
      // if (Object.prototype.isPrototypeOf.call(state, key)) {
      //   state[key] = value;
      // } else {
      //   throw new Error(`'${key}' is not found in state`);
      // }
    },
    setPlatform(state, platform) {
      state.platform = platform
    },
    setInstitution(state, institution) {
      Object.keys(institution).forEach(key => {
        if (_.has(state.institution, key)) {
          state.institution[key] = institution[key]
        }
      })
    },
    setUser(state, user) {
      state.user = user
      sessionStorage.setItem('state', JSON.stringify(state));
    },
    setPermissionList(state, permissionList) {
      state.permissionList = _.clone(permissionList)
    },
    setUArgs(state, args) {
      // 置空，确保同时只能进行一个功能块的编辑
      Object.keys(state.uArgs).forEach(key => {
        if (typeof state.uArgs[key] === 'string') {
          state.uArgs[key] = ''
        } else if (typeof state.uArgs[key] === 'number') {
          state.uArgs[key] = 0
        } else if (state[key] instanceof Array) {
          state.uArgs[key] = []
        } else if (state[key] instanceof Object) {
          state.uArgs[key] = {}
        } else {
          state.uArgs[key] = ''
        }
      })

      Object.keys(args).forEach(key => {
        if (_.has(state.uArgs, key)) {
          state.uArgs[key] = args[key]
        }
      })
    },
    setIndexManageInfo(state, payload) {
      state.indexManageInfo = payload
    },
    setPadStatus(state, status) {
      state.padStatus = status
    },

    setFilterFormForPreviousAndNext(state, payload) {
      state.filterFormForPreviousAndNext = payload
    },
    // 重置 uArgs
    initUArgs(state) {
      Object.keys(state.uArgs).forEach(key => {
        if (typeof state.uArgs[key] === 'string') {
          state.uArgs[key] = ''
        } else if (typeof state.uArgs[key] === 'number') {
          state.uArgs[key] = 0
        } else if (state[key] instanceof Array) {
          state.uArgs[key] = []
        } else if (state[key] instanceof Object) {
          state.uArgs[key] = {}
        } else {
          state.uArgs[key] = ''
        }
      })
    }
  },
  actions: {
    toggleDevice({ commit }, device) {
      commit('TOGGLE_DEVICE', device)
    },
  },
  getters: {

    getAuthorization(state) {
      return state.authorization
    },
    getUArgs(state) {
      return state.uArgs
    },
    getUser(state) {
      return state.user
    },
    getInstitution(state) {
      return state.institution
    }
  },

  plugins: [
    createPersistedState({
      storage: window.sessionStorage
    })
  ]
})

export default store
